﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using orienta.Code.JQgrid;
using orienta.Models;
using orienta.Helper;
using System.Data.Entity;
using System.Data;
using orienta.Utils;
using orienta.ViewModels;
using System.Collections;
using orienta.Code;
using System.Data.Objects.DataClasses;

namespace orienta.Controllers
{
    public class SolicitudController : OrientaController
    {
        private GoodTireEntities db = new GoodTireEntities();
        public int _TABLA_UBIGEO = 30;

        public  ActionResult Index()
        {
            if (!validar(User.Identity.Name))
            {
                return RedirectToAction("Account", "LogOn");
            }

            if (Request["id"] != null)
                return Edit(Int32.Parse(Request["id"]));
            
            Solicitud solicitudVM = new Solicitud();
            solicitudVM.referencias.Add(new SolicitudReferencia());
            
            valoresDefecto(solicitudVM);
            cargarCombosFormulario();
            
            return View(solicitudVM);
        }

        public ActionResult List()
        {
            List<ORIMaeSolicitud> solicitudes = new List<ORIMaeSolicitud>();
            return View(solicitudes);

        }

        public ViewResult Imprimir(decimal id)
        {
            ORIMaeSolicitud solicitud = db.ORIMaeSolicitud.Single(o => o.nIdeSolicitud == id);
            return View(solicitud);

        }


        /*fin - get */


       

        


        //
        // POST: /Solicitud/Edit/5


        [HttpPost]
        public ActionResult Index(HttpPostedFileBase file,Solicitud solicitudView)
        {
            if (!validar(User.Identity.Name))
            {
                return RedirectToAction("Home", "Index");
            }

            List<SolicitudReferencia> referencias = obtenerReferencias();
            solicitudView.referencias = referencias;

            SolicitudHelper helper = new SolicitudHelper();
        

            try
            {
                Boolean existe = false;
                ORIMaeSolicitud solicitud = null;

                if (ModelState.IsValid)
                {
                    if (solicitudView.nIdeSolicitud>0)
                    {
                        solicitud = db.ORIMaeSolicitud.Single(o => o.nIdeSolicitud == solicitudView.nIdeSolicitud);
                        existe = true;
                    }
                    if (existe)
                    {
                        db.ObjectStateManager.ChangeObjectState(solicitud, EntityState.Detached);
                        existe = true;
                    }
                    else {
                        solicitud = new ORIMaeSolicitud();
                    }
                    

                    solicitud.nIdeUsuReg = usuario.nIdeUsu;
                    solicitud.nIdePrograma = solicitudView.nIdePrograma;

                    if (usuario.nIdeDep != null)
                        solicitud.nIdeDep = usuario.nIdeDep.Value;
                    

                    solicitud.nIdeTipoModa = solicitudView.nIdeTipoModa;
                    solicitud.nIdeIdioma = solicitudView.nIdeIdioma;
                    
                    solicitud.nIdeClaseSolicitud = solicitudView.nIdClaseSolicitud;
                    solicitud.nTipoSolic = solicitudView.nIdTipoSolicitud;
                    solicitud.nIdeEstadoSol = solicitudView.nIdePara;// Constantes.SOLICITUD_ESTADO.PROCESO;
                    solicitud.nIdePrioridad = solicitudView.nIdePrioridad;

                    
                    /*solicitante*/
                    solicitud.nIdePersonSolicita = solicitudView.nIdeSolic.Value;
                    solicitud.nIdeTipoSolicitante = solicitudView.nTipoSolicitante;

                    /*afectado*/                    
                    solicitud.nIdePersonAfectado = solicitudView.nIdeAfect.Value;

                    solicitud.nTipoSolic= solicitudView.nIdTipoSolicitud;
                    solicitud.nIdeClaseSolicitud = solicitudView.nIdClaseSolicitud;

                    solicitud.vSumilla = solicitudView.sSumilla;
                    solicitud.vAccion = solicitudView.sAccion;
                    solicitud.nIdeMedio = solicitudView.nIdeMedio;
                    
                    if (!existe)
                    {
                        DateTime dtFecRegistro = FormUtils.formatearFecha(solicitudView.dtFecSolicitud + " " + solicitudView.hora + ":" + solicitudView.minuto, "dd/MM/yyyy HH:mm");
                        solicitud.dtFecRegistro = DateTime.Now;
                        solicitud.dtFecSolicitud = dtFecRegistro;
                        solicitud.nAnnSolicitud = DateTime.Now.Year;
                        asignarCorrelativo(solicitud, solicitudView);
                    }                    

                    /*INICIO - CREACION DE EVENTOS*/
                    
                    ORIDetSolicitud eventos = new ORIDetSolicitud();

                    if (solicitudView.nIdePara == Constantes.SOLICITUD_PARA.ARCHIVO_FINAL || solicitudView.nIdePara == Constantes.SOLICITUD_PARA.ARCHIVO_TEMPORAL)
                    {
                        eventos.nPlazo = solicitudView.nPlazo;
                        eventos.nIdePara = solicitudView.nIdePara;
                        eventos.nIdePrioridad = Constantes.SOLICITUD_PRIORIDAD_DEFECTO;//alta

                        if (solicitudView.nIdePara == Constantes.SOLICITUD_PARA.ARCHIVO_FINAL)
                        {
                            eventos.nIdeEstado = Constantes.SOLICITUD_ESTADO.CONCLUIDO;
                            eventos.vSumilla = "SE DERIVO A ARCHIVO FINAL";
                            solicitud.nIdeEstadoSol = Constantes.SOLICITUD_ESTADO.CONCLUIDO;
                            solicitud.dtFecResolucion= solicitud.dtFecRegistro ;
                        }
                        else
                        {
                            eventos.nIdeEstado = Constantes.SOLICITUD_ESTADO.ARCHIVADO;
                            eventos.vSumilla = "SE DERIVO A ARCHIVO TEMPORAL";
                            solicitud.nIdeEstadoSol = Constantes.SOLICITUD_ESTADO.ARCHIVADO;
                        }
                        eventos.nSeqPaso = 1;
                        eventos.dtFecReg = DateTime.Now;
                        eventos.nIdeUsuReg = usuario.nIdeUsu;
                        eventos.nFolios = 0;

                        ORIDetSoliActor detSoliActor = new ORIDetSoliActor();
                        int nSeqActor = 1;
                        detSoliActor.nSeqActor = nSeqActor;
                        detSoliActor.nIdeTipoActor = Constantes.SOLICITUD_TIPO_ACTOR.QUE_DERIVA;
                        detSoliActor.nIdeTipoCategoria = Constantes.SOLICITUD_CATEGORIA.PERSONA;
                        detSoliActor.nIdeDep =  usuario.nIdeDep.Value;
                        detSoliActor.dtFecRecepcion = DateTime.Now;
                        detSoliActor.dtFecDerivacion= DateTime.Now;
                        detSoliActor.dtFecRecFisica = DateTime.Now;

                        detSoliActor.nIdeFuncionario = usuario.nIdeFuncionario;
                        eventos.ORIDetSoliActor.Add(detSoliActor);


                        detSoliActor = new ORIDetSoliActor();
                        detSoliActor.nSeqActor = 2;
                        detSoliActor.nIdeTipoActor = Constantes.SOLICITUD_TIPO_ACTOR.QUE_ES_DERIVADO;
                        detSoliActor.dtFecRecepcion = DateTime.Now;

                       
                        detSoliActor.nIdeTipoCategoria = Constantes.SOLICITUD_CATEGORIA.AREA;
                         if (solicitudView.nIdePara == Constantes.SOLICITUD_PARA.ARCHIVO_FINAL)
                             detSoliActor.nIdeDep = Constantes.SOLICITUD_PARA_DEPENDENCIA.ARCHIVO_FINAL;
                        else
                             detSoliActor.nIdeDep = Constantes.SOLICITUD_PARA_DEPENDENCIA.ARCHIVO_TEMPORAL;

                         eventos.ORIDetSoliActor.Add(detSoliActor);


                    }
                    else
                    {
                        eventos.nIdePara = solicitudView.nIdePara;
                        eventos.nIdePrioridad = solicitudView.nIdePrioridad;

                        eventos.nIdeEstado = Constantes.SOLICITUD_ESTADO.PROCESO;

                        eventos.nSeqPaso = 1;// solicitudHelper.getSeqPasoEvento(solicitud.nIdeSolicitud);
                        if (solicitudView.nIdeTipoDocEntrante != 0)
                        eventos.nIdeTipoDoc = solicitudView.nIdeTipoDocEntrante;
                        eventos.vNumDocum = solicitudView.sNroDocEntrante;
                        if (solicitudView.dtFecDocEntrante!=null )
                        eventos.dtFecDocum = FormUtils.formatearFecha(solicitudView.dtFecDocEntrante);
                        eventos.nPlazo = solicitudView.nPlazo;
                        eventos.nIdePeriodo = solicitudView.nIdePeriodo;
                        eventos.dtFecReg = DateTime.Now;
                        eventos.nFolios = solicitudView.nFolios;
                        eventos.vSumilla = solicitudView.sSumilla;
                        eventos.nIdeUsuReg = usuario.nIdeUsu;


                        List<String> errores = helper.cargarDerivados(eventos, solicitudView.sDerivar, usuario);

                        if (errores.ToArray().Length > 0)
                        {
                            foreach (String error in errores)
                            {
                                ModelState.AddModelError("", error);

                            }
                            cargarCombosFormulario();

                            return View(solicitudView);
                        }

                        int nSeqArchivo = 0;
                        foreach (SolicitudReferencia referencia in solicitudView.referencias)
                        {
                            if (0 != referencia.nIdTipoDocumento &&
                                !"".Equals(referencia.vNroDocumento) &&
                                !"".Equals(referencia.dFecha))
                            {
                                nSeqArchivo++;
                                ORIDetArchivo detArchivos = new ORIDetArchivo();
                                detArchivos.nIdeTipoDocum = referencia.nIdTipoDocumento;
                                detArchivos.vNumDocum = referencia.vNroDocumento;
                                detArchivos.dtFecDocum = FormUtils.formatearFecha(referencia.dFecha);
                                detArchivos.nSeqPaso = eventos.nSeqPaso;
                                referencia.nSeqPaso = eventos.nSeqPaso;
                                // detArchivos.imArchivoAdj = referencia.imArchivoAdj;
                                eventos.ORIDetArchivo.Add(detArchivos);

                                
                            }
                        }
                    }
                 
                    /*FIN - CREACION DE EVENTOS*/
                    if (existe) {
                       
                        //modificar Evento a derivado

                        int para1 = solicitudView.nIdePara;

                        List<ORIDetSolicitud> lista = db.ORIDetSolicitud.Where(o => o.nIdeSolicitud == solicitudView.nIdeSolicitud).OrderByDescending(o => o.nSeqPaso).ToList();
                        ORIDetSolicitud evento = lista.First();// db.ORIDetSolicitud.Last(o => o.nIdeSolicitud == solicitudView.nIdeSolicitud);

                        if (para1 == Constantes.SOLICITUD_PARA.ARCHIVO_TEMPORAL)
                        {
                            //actualizar sumilla y accion
                        }
                        else {
                            db.ObjectStateManager.ChangeObjectState(evento, EntityState.Detached);
                            evento.nIdeEstado =  Constantes.SOLICITUD_ESTADO.PROCESO;
                            db.ORIDetSolicitud.Attach(evento);
                            db.ObjectStateManager.ChangeObjectState(evento, EntityState.Modified);

                            ORIDetSolicitud eventonuevo = new ORIDetSolicitud();

                            eventonuevo.nPlazo = solicitudView.nPlazo;
                            eventonuevo.nIdePara = solicitudView.nIdePara;
                            eventonuevo.nIdePrioridad = Constantes.SOLICITUD_PRIORIDAD_DEFECTO;//alta
                            eventonuevo.nIdeEstado = Constantes.SOLICITUD_ESTADO.CONCLUIDO;
                            eventonuevo.nSeqPaso = evento.nSeqPaso + 1;
                            eventonuevo.dtFecReg = DateTime.Now;
                            eventonuevo.nIdeUsuReg = usuario.nIdeUsu;
                            eventonuevo.nFolios = 0;
                            eventonuevo.nIdeSolicitud = solicitud.nIdeSolicitud;

                            if (para1 == Constantes.SOLICITUD_PARA.ARCHIVO_FINAL)
                            {

                                eventonuevo.vSumilla = "SE DERIVO A ARCHIVO FINAL";
                            

                            }
                            else {

                                eventonuevo.vSumilla = solicitudView.sSumilla;
                                
                            }

                            db.ORIDetSolicitud.AddObject(eventonuevo);

                        }

                        



                        
                        //ORIDetSolicitud paso = solicitud.ORIDetSolicitud.Last();
                        //paso.nIdeEstado = 
                        /*
                        //eventos.nSeqPaso = evento.nSeqPaso + 1;

                        ORIDetSolicitud eventoNuevo = new ORIDetSolicitud();
                        eventoNuevo.nSeqPaso = evento.nSeqPaso + 1;
                        eventoNuevo.nIdeEstado = solicitudView.nIdePara;
                        */
                        //solicitud.ORIDetSolicitud.Add(eventoNuevo);

                        //ORIDetSolicitud evento = lista.First();// db.ORIDetSolicitud.Last(o => o.nIdeSolicitud == solicitudView.nIdeSolicitud);
                        
                        db.ORIMaeSolicitud.Attach(solicitud);
                        db.ObjectStateManager.ChangeObjectState(solicitud, EntityState.Modified);

                    }
                    else
                    {
                        solicitud.ORIDetSolicitud.Add(eventos);
                        db.ORIMaeSolicitud.AddObject(solicitud);
                    }

                    db.SaveChanges();

                    EntityCollection<ORIDetArchivo> archivos = eventos.ORIDetArchivo;

                    foreach (ORIDetArchivo archivo in archivos) {
                        foreach (SolicitudReferencia referencia in solicitudView.referencias) {
                            if (referencia.nSeqPaso==archivo.nSeqPaso)
                                EstadisticaHelper.executeStore("usp_upload", new Object[] { archivo.nIdeSolicitud, archivo.nSeqPaso, referencia.vArchivoAdj ,referencia.imArchivoAdj }, new string[] { "nIdeSolicitud", "nSeqPaso", "archivos", "datos" }, new SqlDbType[] { SqlDbType.Int, SqlDbType.Int, SqlDbType.NVarChar, SqlDbType.Image });

                        }
                        
                    }

                    

                    String claseSolicitud = db.ORIDetCompendio.Single(o => o.nIdeDetalle == solicitud.nIdeClaseSolicitud).vNomDetalle;

                    ViewBag.nroSolicitud = String.Format("{0:0000}", solicitud.nIdeDep) + "-" + solicitud.nAnnSolicitud + "-" + claseSolicitud.Substring(0, 3) + "-" + String.Format("{0:000000}", solicitud.nNumCorrelativo);
                    ViewBag.nIdeSolicitud =  solicitud.nIdeSolicitud;
                    ViewBag.de = String.Format("{0:0000}", solicitud.nIdeDep) + "-" + solicitud.ORIMaeDependencia.vDescripcion;
                    List<String> para = new List<String>();
                    foreach (ORIDetSoliActor actor in solicitud.ORIDetSolicitud.Last<ORIDetSolicitud>().ORIDetSoliActor) {
                        if (actor.nIdeTipoActor != Constantes.SOLICITUD_TIPO_ACTOR.QUE_DERIVA)
                        {
                            if(actor.nIdeTipoCategoria==Constantes.SOLICITUD_CATEGORIA.PERSONA)
                                para.Add(String.Format("{0:0000}", actor.nIdeDep) + "-" + actor.ORIMaeFuncionario.vPrimNombre + " " + actor.ORIMaeFuncionario.vPrimApellido);
                            else
                                para.Add(String.Format("{0:0000}", actor.nIdeDep) + "-" + actor.ORIMaeDependencia.vDescripcion);
                        }
                    }
                    ViewBag.para = para;
                    return View("Confirmacion");

                }
            }
            catch (Exception e)
            {
                Response.Write(e.ToString());
                Response.Write(e.StackTrace.ToString());
                ModelState.AddModelError("", "La solicitud no se pudo grabar");
            }

            cargarCombosFormulario();

            return View(solicitudView);
        }



        public ActionResult Edit1(int id)
        {
           
                if (!validar(User.Identity.Name))
                {
                    return RedirectToAction("Home", "Index");
                }

                Solicitud solicitudView = new Solicitud();
                
                List<SolicitudReferencia> referencias = obtenerReferencias();
                solicitudView.referencias = referencias;

                SolicitudHelper helper = new SolicitudHelper();
        


                return View("Index",solicitudView);
           
        }

        //
        // GET: /Solicitud/Delete/5

        public ActionResult Delete(int id)
        {
            return View();
        }

        //
        // POST: /Solicitud/Delete/5

        [HttpPost]
        public ActionResult Delete(int id, FormCollection collection)
        {
            try
            {
                // TODO: Add delete logic here

                return RedirectToAction("Index");
            }
            catch
            {
                return View();
            }
        }


        /*INICIO - carga de campos del formulario*/
        private void cargarCombosFormulario()
        {
            HtmlUtils htmlUtils = new HtmlUtils();

            ViewBag.TipoModalidad = htmlUtils.getComboTipoModalidad();
            ViewBag.Idioma = htmlUtils.getComboIdioma();
            ViewBag.TipoDocumento = htmlUtils.getComboTipoDocumento();
            ViewBag.TipoDiscapacidad = htmlUtils.getComboTipoDiscapacidad();
            ViewBag.TipoSolicitante = htmlUtils.getComboTipoSolicitante();
            ViewBag.TipoPrioridad = htmlUtils.getComboTipoPrioridad();
            ViewBag.PrioridadSolicitud = htmlUtils.getComboPrioridadSolicitud();
            ViewBag.Pais = htmlUtils.getComboPais();
            ViewBag.ClaseSolicitud = htmlUtils.getComboClaseSolicitud();
            ViewBag.ParaAtender = htmlUtils.getComboParaAtender();
            ViewBag.Prioridad = htmlUtils.getComboPrioridad();
            ViewBag.Programa = htmlUtils.getComboProgramaMidis();
            ViewBag.Plazo = htmlUtils.getComboPlazo();
            ViewBag.Medio = htmlUtils.getComboMedio();
            ViewBag.Clase = htmlUtils.getComboClaseSolicitud();
            ViewBag.TipoSolicitud = htmlUtils.getComboTipoSolicitud();


        }
        /*FIN - carga de campos del formulario*/

        private List<SolicitudReferencia> obtenerReferencias()
        {

            String[] arrTipoDocumento = Request.Form["vTipoDocumento[]"].Split(',');
            String[] arrIdTipoDocumento = Request.Form["nIdTipoDocumento[]"].Split(',');
            String[] arrNroDocumento = Request.Form["vNroDocumento[]"].Split(',');
            String[] arrFecha = Request.Form["dFecha[]"].Split(',');
            String[] arrComentario = Request.Form["vComentario[]"].Split(',');
            String[] arrReferenciaAux =Request.Form["referenciaAux[]"].Split(',');

            String[] arrArchivoAdj = "".Split(',');

            HttpFileCollectionBase uploads = Request.Files;
            List<HttpPostedFileBase> files = new List<HttpPostedFileBase>();
            foreach(String file in uploads){
                HttpPostedFileBase hpf = Request.Files[file] as HttpPostedFileBase;
                files.Add(hpf);
            }
            
            int nroReferencias = arrTipoDocumento.Length;
            List<SolicitudReferencia> referencias = new List<SolicitudReferencia>();

            for (int i = 0; i < nroReferencias; i++)
            {
                String nombreArchivo = "vArchivoAdj" + arrReferenciaAux[i];

                SolicitudReferencia referencia = new SolicitudReferencia();
                referencia.vTipoDocumento = arrTipoDocumento[i];
                referencia.nIdTipoDocumento = int.Parse(arrIdTipoDocumento[i]);
                referencia.vNroDocumento = arrNroDocumento[i];
                referencia.dFecha = arrFecha[i];
                referencia.vComentario = arrComentario[i];
                if (Request.Files[nombreArchivo].InputStream.Length>0)
                {
                    referencia.vArchivoAdj = Request.Files[nombreArchivo].FileName;
                    referencia.imArchivoAdj = FormUtils.GetBytes(Request.Files[nombreArchivo]);
                }

                //referencia.imArchivoAdj = FormUtils.GetBytes(referencia.vArchivoAdj);
                //referencia.imArchivoAdj = FormUtils.GetBytes(files[i]);
                referencias.Add(referencia);
            }
            return referencias;
        }
        private void valoresDefecto(Solicitud solicitud) {
                solicitud.paisSol = Constantes.PAIS_DEFECTO + "<" + Constantes.PAIS_DEFECTO_COD + ">";
                solicitud.nIdiPaisSolic = Constantes.PAIS_DEFECTO_COD;
                solicitud.paisAfect = Constantes.PAIS_DEFECTO + "<" + Constantes.PAIS_DEFECTO_COD + ">";
                solicitud.nIdiPaisAfect = Constantes.PAIS_DEFECTO_COD;
                solicitud.dtFecSolicitud = String.Format("{0:dd/MM/yyyy}", DateTime.Now);
                solicitud.hora = String.Format("{0:hh}", DateTime.Now);
                solicitud.minuto = String.Format("{0:mm}", DateTime.Now);
                solicitud.nIdeSolic = null;
                solicitud.nIdeAfect = null;
        }
        public ViewResult AutoComplete()
        {
            
            decimal id = Int32.Parse( Request["id"]);
            String tipo = Request["tipo"];
            String subTipo = Request["subTipo"];
            String grupo = Request["grupo"];
            String corto = Request["corto"];
            ViewBag.campo = Request["campo"];
            IEnumerable list = null;
            if (tipo.Equals("C"))
            {
                if (subTipo != null)
                {
                    ViewBag.campo = null;// Request["campo"] + subTipo;
                    if (corto!=null)
                        ViewBag.vNomDetalle = "vNomCorto";
                    else
                        ViewBag.vNomDetalle = "vNomDetalle";
                    SolicitudHelper helper = new SolicitudHelper();
                    list = helper.getCompendioGrupo(Int32.Parse(subTipo));
                }
                else
                    list = db.ORIDetCompendio.Where<ORIDetCompendio>(o => o.nIdeCompendio == id).ToList();
                return View(list);
            }
            else
            {
                validar(User.Identity.Name);
                ViewBag.vDependencia = "vDependencia";
                ORIMaeDependencia d = db.ORIMaeDependencia.Single(o => o.nIdeDep==usuario.nIdeDep);
                list = db.ORIMaeDependencia.ToList();
                return View("Dependencia",list);
            }
            
        }

        public ViewResult Edit(int id)
        {

            cargarCombosFormulario();
            //ViewBag.solicitudId = id;

            ORIMaeSolicitud orimaesolicitud = db.ORIMaeSolicitud.Single(o => o.nIdeSolicitud == id);

            Solicitud solicitudVM = new Solicitud();
            solicitudVM.nIdeSolicitud = id;
            solicitudVM.referencias.Add(new SolicitudReferencia());
            /*inicio - datos generales*/
            solicitudVM.nIdePrograma = Convert.ToInt32(orimaesolicitud.nIdePrograma);
            solicitudVM.nIdeTipoModa = Convert.ToInt32(orimaesolicitud.nIdeTipoModa);
            solicitudVM.nIdeIdioma= Convert.ToInt32(orimaesolicitud.nIdeIdioma);
            solicitudVM.dtFecSolicitud = String.Format("{0:dd/MM/yyyy}", orimaesolicitud.dtFecSolicitud);
            solicitudVM.hora = String.Format("{0:HH}", orimaesolicitud.dtFecSolicitud);
            solicitudVM.minuto = String.Format("{0:mm}", orimaesolicitud.dtFecSolicitud);
            solicitudVM.sSumilla = orimaesolicitud.vSumilla;
            solicitudVM.sAccion = orimaesolicitud.vAccion;

            solicitudVM.nTipoSolicitante = (int)orimaesolicitud.nIdeTipoSolicitante; 
            ORIMaePersona solicitante = orimaesolicitud.ORIMaePersona;
            solicitudVM.nNumDocSolic = solicitante.vNumDocum;
            solicitudVM.paisSol = solicitante.ORIDetCompendio2.vNomCorto;
            solicitudVM.nIdiPaisSolic = (int) solicitante.ORIDetCompendio2.nIdeDetalle;
            solicitudVM.nApePatSolic = solicitante.vPriApellido;
            solicitudVM.nApeMatSolic = solicitante.vSegApellido;
            solicitudVM.nNombreSolic = solicitante.vPriNombre;
            solicitudVM.nIdeSolic= solicitante.nIdePersona;

            ORIMaePersona afectado = orimaesolicitud.ORIMaePersona1;
            solicitudVM.nNumDocAfect = afectado.vNumDocum;
            solicitudVM.paisAfect= afectado.ORIDetCompendio2.vNomCorto;
            solicitudVM.nIdiPaisAfect = (int)afectado.ORIDetCompendio2.nIdeDetalle;
            solicitudVM.nApePatAfect = afectado.vPriApellido;
            solicitudVM.nApeMatAfect = afectado.vSegApellido;
            solicitudVM.nNombreAfect = afectado.vPriNombre;
            solicitudVM.nIdeAfect = afectado.nIdePersona;
            /*fin- datos generales*/
            solicitudVM.nIdClaseSolicitud = (int)orimaesolicitud.nIdeClaseSolicitud;
            solicitudVM.nIdTipoSolicitud = (int)orimaesolicitud.nTipoSolic;
            HtmlUtils htmlUtils = new HtmlUtils();
            ViewBag.TipoSolicitud = htmlUtils.getComboTipoSolicitud((int)orimaesolicitud.nIdeClaseSolicitud);

            
            
            ORIDetSolicitud detalle = orimaesolicitud.ORIDetSolicitud.OrderByDescending(o => o.nSeqPaso).Last(o => o.nIdeSolicitud == id);
            solicitudVM.nIdePara = (int)detalle.nIdePara;
            solicitudVM.nIdePrioridad = (int)detalle.nIdePrioridad;
            List<ORIDetArchivo> archivos = detalle.ORIDetArchivo.ToList();
            solicitudVM.dtFecDocEntrante = String.Format("{0:dd/MM/yyyy}", detalle.dtFecDocum);
            solicitudVM.sNroDocEntrante = detalle.vNumDocum;

            foreach (ORIDetArchivo archivo in archivos)
            {
                SolicitudReferencia referenciaVM = new SolicitudReferencia();
                referenciaVM.vNroDocumento = archivo.vNumDocum;
                referenciaVM.nIdTipoDocumento = (int)archivo.nIdeTipoDocum;
                referenciaVM.vComentario = archivo.vComentario;
                solicitudVM.referencias.Add(referenciaVM);
            }

            return View("Index", solicitudVM);

        }


        public void cargarCombosFormularioDireccion()
        {
            HtmlUtils htmlUtils = new HtmlUtils();
            ViewBag.TipoVia = htmlUtils.getComboTipoVia();
            ViewBag.TipoZona = htmlUtils.getComboTipoZona();
            ViewBag.Pais = htmlUtils.getComboPais();
        }

        public ViewResult Direccion(int id)
        {
            ViewBag.MsgConfirm = "";
            
            cargarCombosFormularioDireccion();
            var persona = new PersonaInfo();
            var per = db.ORIMaePersona.Where(m => m.nIdePersona == id).SingleOrDefault();
            var c = from t in db.ORIDetDireccion
                    where t.nIdePersona == id &&
                    (t.dtFecFinVig == null || t.dtFecFinVig > DateTime.Today)
                    select t;
            var dir = c.FirstOrDefault();
            persona = new PersonaInfo
            {
                nIdePersona = id,
                discapacidades = null,
                dtFecNac = "01/01/1990",
                sPrimerNombre = per.vPriNombre,
                sApellidoPaterno = per.vPriApellido,
                sApellidoMaterno = per.vSegApellido,
                sNumDoc = per.vNumDocum,
                sEmail = "prueba@algo.com",
                nIdeGenero = Convert.ToInt32(per.nIdeTipoGenero),
                nIdePais = Convert.ToInt32(per.nIdeCodPaisDoc),
                nIdeTipoDoc = Convert.ToInt32(per.nIdeTipoDocum)
            };
            ViewBag.NombrePersona = string.Format("{0} {1} {2}", persona.sPrimerNombre, persona.sApellidoPaterno,
                                                  persona.sApellidoMaterno);
            if (dir != null)
            {
                persona.PersonaDireccion.nIdeTipoVia = Convert.ToInt32(dir.nIdeTipoVia);
                persona.PersonaDireccion.nIdeTipoZona = dir.nIdeTipoZona;
                persona.PersonaDireccion.sBlock = dir.vNumBlock;
                persona.PersonaDireccion.sCentroPoblado = dir.vCenPoblado;
                var array = dir.vNumDep.Split('/');
                persona.PersonaDireccion.sDepartamento = array[0];
                persona.PersonaDireccion.sEtapa = dir.vNumEtapa;
                if(array.Count()>1)
                    persona.PersonaDireccion.sInterior = array[1];
                persona.PersonaDireccion.sKm = dir.vNumKilom;
                persona.PersonaDireccion.sLote = dir.vNumLote;
                persona.PersonaDireccion.sManzana = dir.vNumManza;
                persona.PersonaDireccion.sNombreVia = dir.vNomVia;
                persona.PersonaDireccion.sNombreZona = dir.vNomZona;
                persona.PersonaDireccion.sNumeroVia = dir.vNumVia;
                persona.PersonaDireccion.sReferencia1 = dir.vRefe1;
                persona.PersonaDireccion.sReferencia2 = dir.vRefe2;
                ORIDetCompendio objDetCompendio = db.ORIDetCompendio.SingleOrDefault(o => o.nIdeDetalle==dir.nIdeCodUbigeo && o.nIdeCompendio==_TABLA_UBIGEO);
                if (objDetCompendio != null)
                {
                    persona.PersonaDireccion.sUbigeoDistrito = objDetCompendio.vCodElemento;
                    persona.PersonaDireccion.sUbigeoProvincia = objDetCompendio.vCodElemento.Substring(0,4);
                    persona.PersonaDireccion.sUbigeoDepartamento = objDetCompendio.vCodElemento.Substring(0,2);
                }
            }
            return View("Direccion", persona);
        }

        [HttpPost]
        public ActionResult Direccion(PersonaInfo persona)
        {
            ViewBag.MsgConfirm = "";
            var jsonResponse = new JsonResponse { Success = false };
            ViewBag.NombrePersona = string.Format("{0} {1} {2}", persona.sPrimerNombre, persona.sApellidoPaterno,
                                                  persona.sApellidoMaterno);
            cargarCombosFormularioDireccion();
            if (ModelState.IsValid)
            {
                ORIMaePersona objpersona = new ORIMaePersona();
                SolicitudHelper solicitudHelper = new SolicitudHelper();
                decimal intCodUbigeo = 0;
                try
                {
                    var c = from t in db.ORIDetDireccion
                            where t.nIdePersona == persona.nIdePersona &&
                                  (t.dtFecFinVig == null || t.dtFecFinVig >= DateTime.Today)
                            select t;

                    using (var context = new GoodTireEntities())
                    {
                        foreach (var a in c)
                        {
                            a.dtFecFinVig = DateTime.Now.Date;
                        }
                        context.SaveChanges();
                    }
                
                ORIDetDireccion objDireccion = new ORIDetDireccion();
                objDireccion.nIdePersona = persona.nIdePersona;
                objDireccion.nIdeTipoVia = persona.PersonaDireccion.nIdeTipoVia;
                objDireccion.vNomVia = persona.PersonaDireccion.sNombreVia;
                objDireccion.vNumVia = persona.PersonaDireccion.sNumeroVia;
                objDireccion.vNumDep = persona.PersonaDireccion.sDepartamento + "/" + persona.PersonaDireccion.sInterior;
                objDireccion.vNumManza = persona.PersonaDireccion.sManzana;
                objDireccion.vNumLote = persona.PersonaDireccion.sLote;
                objDireccion.vNumKilom = persona.PersonaDireccion.sKm;
                objDireccion.vNumBlock = persona.PersonaDireccion.sBlock;
                objDireccion.vNumEtapa = persona.PersonaDireccion.sEtapa;
                objDireccion.nIdeTipoZona =persona.PersonaDireccion.nIdeTipoZona;
                objDireccion.dtFecIniVig = DateTime.Now.Date;
                objDireccion.vNomZona = persona.PersonaDireccion.sNombreZona;

                string strCodUbigeo = persona.PersonaDireccion.sUbigeoDistrito;
                ORIDetCompendio objDetCompendio = db.ORIDetCompendio.SingleOrDefault(o => (o.nIdeCompendio == _TABLA_UBIGEO && o.vCodElemento == strCodUbigeo));
                if (objDetCompendio != null)
                {
                    intCodUbigeo = objDetCompendio.nIdeDetalle;
                }
                objDireccion.nIdeCodUbigeo = intCodUbigeo;
                objDireccion.vCenPoblado = persona.PersonaDireccion.sCentroPoblado;
                objDireccion.vRefe1 = persona.PersonaDireccion.sReferencia1;
                objDireccion.vRefe2 = persona.PersonaDireccion.sReferencia2;

                objDireccion.nIdeUsuReg = 1;

                db.ORIDetDireccion.AddObject(objDireccion);
                db.SaveChanges();
                
                cargarCombosFormularioDireccion();
                ViewBag.MsgConfirm = "Se guardó la dirección correctamente.";
                }
                catch (Exception)
                {
                    ViewBag.MsgConfirm = "Ocurrió un error, intentelo más tarde.";
                }
                finally
                {
                    
                }
            }
            return PartialView(persona);
        }

        private void asignarCorrelativo(ORIMaeSolicitud solicitud, Solicitud solicitudView)
        {


            SolicitudHelper solicitudHelper = new SolicitudHelper();
            decimal nNumCorrelativo = solicitudHelper.getCorrelativoSolicitud(solicitud.nAnnSolicitud, solicitudView.nIdClaseSolicitud, solicitud.nIdeDep);

            if (nNumCorrelativo == 1)
            {
                ORIMaeAreaNumera areanumera = new ORIMaeAreaNumera();
                areanumera.dtFecReg = DateTime.Now;
                areanumera.nAnoCorre = solicitud.nAnnSolicitud;
                areanumera.nIdeClaseSolicitud = solicitud.nIdeClaseSolicitud;
                areanumera.nIdeDep = solicitud.nIdeDep;
                areanumera.nIdeUsuReg = usuario.nIdeUsu;
                areanumera.nNumCorrelativo = nNumCorrelativo;

                db.ORIMaeAreaNumera.AddObject(areanumera);

            }
            else
            {
                ORIMaeAreaNumera areanumera = db.ORIMaeAreaNumera.Single(o => o.nAnoCorre == solicitud.nAnnSolicitud && o.nIdeDep == solicitud.nIdeDep && o.nIdeClaseSolicitud == solicitud.nIdeClaseSolicitud);
                db.ObjectStateManager.ChangeObjectState(areanumera, EntityState.Detached);
                areanumera.nNumCorrelativo = areanumera.nNumCorrelativo + 1;

                db.ORIMaeAreaNumera.Attach(areanumera);
                db.ObjectStateManager.ChangeObjectState(areanumera, EntityState.Modified);


            }

            solicitud.nNumCorrelativo = nNumCorrelativo;
        }

        [HttpPost]
        public virtual JsonResult ListarDirecciones(int id)
        {
            try
            {
                var jsonResponse = new JsonResponse();
                var solicitudHelper = new SolicitudHelper();
                var items = solicitudHelper.ListarDirecciones(id);

                jsonResponse.Success = true;
                jsonResponse.Data = items;
                return Json(jsonResponse, JsonRequestBehavior.AllowGet);
            }
            catch (Exception ex)
            {
                return Json(new JsonResponse {Message = ex.Message}, JsonRequestBehavior.AllowGet);
            }
        }
    }
}
